package br.uvv.sao.dao;

import org.hibernate.Criteria;
import org.hibernate.FetchMode;
import org.hibernate.HibernateException;
import org.hibernate.criterion.Restrictions;

import br.uvv.sao.domain.Aluno;
import br.uvv.sao.domain.Professor;
import br.uvv.sao.domain.Usuario;
import br.uvv.sao.util.HibernateUtil;

public class LoginDAO extends DAO {
	
	private static final long serialVersionUID = -7276000623392094505L;

	private String mensagemRetorno = "";
	
	public void atualizar(Aluno usuarioInstance){
		try{
			this.sessao = HibernateUtil.getSessionfactory().getCurrentSession();
			this.transacao = this.sessao.beginTransaction();
			this.sessao.update(usuarioInstance);
			this.transacao.commit();
			mensagemRetorno = "SUCESSO: Operação realizada com sucesso.";
		} catch(HibernateException e){
			System.out.println("H_ERRO - Usuario/Atualizar: " + e.getMessage());
			mensagemRetorno = "ERRO: Não foi possível alterar os dados do aluno '" + usuarioInstance.getNomeCompleto() + "'";
		} finally {
			try {
				if (this.sessao.isOpen()){
					this.sessao.close();
				}
			} catch (Throwable e){
				System.out.println("ERRO - Usuario/Atualizar: " + e.getMessage());
				mensagemRetorno = "ERRO: Não foi possível alterar os dados do aluno '" + usuarioInstance.getNomeCompleto() + "'";
			}
		}
	}
	
	public void atualizar(Professor usuarioInstance) {
		try{
			this.sessao = HibernateUtil.getSessionfactory().getCurrentSession();
			this.transacao = this.sessao.beginTransaction();
			this.sessao.update(usuarioInstance);
			this.transacao.commit();
			mensagemRetorno = "SUCESSO: Operação realizada com sucesso.";
		} catch(HibernateException e){
			System.out.println("H_ERRO - Usuario/Atualizar: " + e.getMessage());
			mensagemRetorno = "ERRO: Não foi possível alterar os dados do professor '" + usuarioInstance.getNomeCompleto() + "'";
		} finally {
			try {
				if (this.sessao.isOpen()){
					this.sessao.close();
				}
			} catch (Throwable e){
				System.out.println("ERRO - Usuario/Atualizar: " + e.getMessage());
				mensagemRetorno = "ERRO: Não foi possível alterar os dados do professor '" + usuarioInstance.getNomeCompleto() + "'";
			}
		}
	}
	
	@SuppressWarnings("deprecation")
	public Aluno getAluno(Long id){
		Aluno alunoInstance = null;
		try{
			this.sessao = HibernateUtil.getSessionfactory().getCurrentSession();
			this.transacao = this.sessao.beginTransaction();
			Criteria filtro = this.sessao.createCriteria(Aluno.class);
			filtro.add(Restrictions.eq("id", id));
			filtro.setFetchMode("perfil", FetchMode.EAGER);
			alunoInstance = (Aluno) filtro.uniqueResult();
			this.transacao.commit();
		} catch(Throwable e){
			if (this.transacao.isActive()){
				this.transacao.rollback();
			}
		} finally {
			try {
				if (this.sessao.isOpen()){
					this.sessao.close();
				}
			} catch (Throwable e){
				System.out.println("ERRO - Usuario/Get: " + e.getMessage());
			}
		}
		return alunoInstance;
	}
	
	@SuppressWarnings("deprecation")
	public Professor getProfessor(Long id){
		Professor professorInstance = null;
		try{
			this.sessao = HibernateUtil.getSessionfactory().getCurrentSession();
			this.transacao = this.sessao.beginTransaction();
			Criteria filtro = this.sessao.createCriteria(Professor.class);
			filtro.add(Restrictions.eq("id", id));
			filtro.setFetchMode("perfil", FetchMode.EAGER);
			professorInstance = (Professor) filtro.uniqueResult();
			this.transacao.commit();
		} catch(Throwable e){
			if (this.transacao.isActive()){
				this.transacao.rollback();
			}
		} finally {
			try {
				if (this.sessao.isOpen()){
					this.sessao.close();
				}
			} catch (Throwable e){
				System.out.println("ERRO - Usuario/Get: " + e.getMessage());
			}
		}
		return professorInstance;
	}
	
	@SuppressWarnings("deprecation")
	public Aluno findByAluno(String login){
		Aluno alunoInstance = new Aluno();
		try{
			this.sessao = HibernateUtil.getSessionfactory().getCurrentSession();
			this.transacao = this.sessao.beginTransaction();
			Criteria filtro = this.sessao.createCriteria(Aluno.class);
			filtro.add(Restrictions.eq("email", login));
			filtro.setFetchMode("perfil", FetchMode.EAGER);
			filtro.setMaxResults(1);
			alunoInstance = (Aluno) filtro.uniqueResult();
			this.transacao.commit();
		} catch(Throwable e){
			System.out.println(e.getMessage());
			if (this.transacao.isActive()){
				this.transacao.rollback();
			}
		} finally {
			try {
				if (this.sessao.isOpen()){
					this.sessao.close();
				}
			} catch (Throwable e){
				System.out.println("ERRO - Usuario/GetAluno: " + e.getMessage());
			}
		}
		return alunoInstance;
	}
	
	public Usuario findByEmail(String email){
		Usuario UsuarioInstance = new Usuario();
		try{
			this.sessao = HibernateUtil.getSessionfactory().getCurrentSession();
			this.transacao = this.sessao.beginTransaction();
			Criteria filtro = this.sessao.createCriteria(Usuario.class);
			filtro.add(Restrictions.eq("email", email));
			filtro.setMaxResults(1);
			UsuarioInstance = (Usuario) filtro.uniqueResult();
			this.transacao.commit();
		} catch(Throwable e){
			System.out.println(e.getMessage());
			if (this.transacao.isActive()){
				this.transacao.rollback();
			}
		} finally {
			try {
				if (this.sessao.isOpen()){
					this.sessao.close();
				}
			} catch (Throwable e){
				System.out.println("ERRO - Usuario/GetUsuario: " + e.getMessage());
			}
		}
		return UsuarioInstance;
	}
	
	public Professor findByProfessor(String login){
		Professor professorInstance = new Professor();
		try{
			this.sessao = HibernateUtil.getSessionfactory().getCurrentSession();
			this.transacao = this.sessao.beginTransaction();
			Criteria filtro = this.sessao.createCriteria(Professor.class);
			filtro.add(Restrictions.eq("email", login));
			professorInstance = (Professor) filtro.uniqueResult();
			this.transacao.commit();
		} catch(Throwable e){
			System.out.println(e.getMessage());
			if (this.transacao.isActive()){
				this.transacao.rollback();
			}
		} finally {
			try {
				if (this.sessao.isOpen()){
					this.sessao.close();
				}
			} catch (Throwable e){
				System.out.println("ERRO - Usuario/GetProfessor: " + e.getMessage());
			}
		}
		return professorInstance;
	}
	
	public Usuario findById(int id){
		Usuario usuarioInstance = new Usuario();
		try{
			this.sessao = HibernateUtil.getSessionfactory().getCurrentSession();
			this.transacao = this.sessao.beginTransaction();
			Criteria filtro = this.sessao.createCriteria(Usuario.class);
			filtro.add(Restrictions.eq("id", id));
			filtro.setMaxResults(1);
			usuarioInstance = (Usuario) filtro.uniqueResult();
			this.transacao.commit();
		} catch(Throwable e){
			System.out.println(e.getMessage());
			if (this.transacao.isActive()){
				this.transacao.rollback();
			}
		} finally {
			try {
				if (this.sessao.isOpen()){
					this.sessao.close();
				}
			} catch (Throwable e){
				System.out.println("ERRO - Usuario/GetId: " + e.getMessage());
			}
		}
		return usuarioInstance;
	}

	public String getMensagemRetorno() {
		return mensagemRetorno;
	}

	public void setMensagemRetorno(String mensagemRetorno) {
		this.mensagemRetorno = mensagemRetorno;
	}
}
